//package com.charley.icloud.admin.security;
//
//import com.charley.icloud.security.utils.PasswordEncoder;
//import org.springframework.security.authentication.BadCredentialsException;
//import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
//import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
//import org.springframework.security.core.AuthenticationException;
//import org.springframework.security.core.userdetails.UserDetails;
//import org.springframework.security.core.userdetails.UserDetailsService;
//
///**
// * 身份验证提供者
// * @author charley
// * @date 2024-04-25 13:31
// *   说明：Spring Security的登录验证是交由ProviderManager负责的
// *   ProviderManager在实际验证的时候又会通过调用AuthenticationProvider的authenticate方法来进行认证
// *   数据库类型的默认实现方案是DaoAuthenticationProvider，因此这里通过继承该Provider定制默认的的登录认证逻辑
// *   覆盖实现additionalAuthenticationChecks方法进行密码匹配：
// *       这里没有使用默认的密码认证器（因为需要使用盐salt来对密码加密，默认密码验证器没有加盐）
// *       所以在这里定制了自己的密码校验逻辑，当然也可以通过直接覆写authenticate方法来完成更大范围的登录认证需求定制
// */
//public class JwtAuthenticationProvider extends DaoAuthenticationProvider {
//
//    public JwtAuthenticationProvider(UserDetailsService userDetailsService) {
//        setUserDetailsService(userDetailsService);
//    }
//
//    @Override
//	protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication)
//			throws AuthenticationException {
//		if (authentication.getCredentials() == null) {
//			logger.debug("Authentication failed: no credentials provided");
//			throw new BadCredentialsException(messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials"));
//		}
//
//		String presentedPassword = authentication.getCredentials().toString();
//		String salt = ((JwtUserDetails) userDetails).getSalt();
//		// 覆写密码验证逻辑
//		if (!new PasswordEncoder(salt).matches(userDetails.getPassword(), presentedPassword)) {
//			logger.debug("Authentication failed: password does not match stored value");
//			throw new BadCredentialsException(messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials"));
//		}
//	}
//
//}
